import random
import time
from datetime import datetime, timedelta


import pandas as pd
import requests

from x01_stock.xx_util.mysql_util import insert_db
from x01_stock.xx_util.io_util import create_directory


# 20240726  此模块已经可以根据传入的开始日期与结束日期获取深交所的融资融券数据，并导入数据库

def is_working_day(date):
    # 判断日期是否为周末
    if date.weekday() >= 5:  # 5和6分别代表周六和周日
        return False

    # 判断日期是否为法定节假日
    # 这里可以根据实际需求添加法定节假日的判断逻辑
    # 如果存在特定的法定节假日列表，可以在此处进行判断

    # 如果以上条件都不满足，则认为是法定工作日
    return True


def download_file(url, file_full_path):
    """
    下载文件
    :param url: 文件的URL
    :param file_name: 保存文件的名称
    """
    # 发起GET请求
    response = requests.get(url, stream=True)
    # print(response)
    # 确保请求成功,如果不成功会抛出异常
    response.raise_for_status()

    # 使用with语句打开文件，确保正确关闭
    with open(file_full_path, 'wb') as file:
        # 分块写入文件
        for chunk in response.iter_content(chunk_size=8192):
            if chunk:  # 过滤掉keep-alive新发送的空包
                file.write(chunk)
    return file_full_path


# 循环跳出的日期，当前日期加一天
def download_rzrq(start_date, end_date, file_save_path):
    all_files = []
    # 开始循环处理
    while start_date < end_date:
        print(start_date)
        # 如果是工作日，则开启下载
        if is_working_day(start_date):
            random_str = ''.join([str(random.randint(0, 9)) for _ in range(16)])
            # 拼接url url = 'https://www.szse.cn/api/report/ShowReport?SHOWTYPE=xlsx&CATALOGID=1837_xxpl&txtDate=2024-07-08&tab2PAGENO=1&random=0.9970942990905536&TABKEY=tab2'
            url = 'https://www.szse.cn/api/report/ShowReport?SHOWTYPE=xlsx&CATALOGID=1837_xxpl&txtDate=' + start_date.strftime('%Y-%m-%d') + '&tab2PAGENO=1&random=0.' + random_str + '&TABKEY=tab2'
            # 防止传入的路径中有文件夹不存在
            create_directory(file_save_path)
            file_path = download_file(url, file_save_path + r'\sz_' + start_date.strftime('%Y-%m-%d') + '.xlsx')
            all_files.append(file_path)
            # 开启休眠防止被拦截
            sleep = random.randint(1, 60)
            print('开启休眠防止被拦截，准备休眠--' + str(sleep))
            time.sleep(sleep)
        start_date = start_date + timedelta(days=1)
    print('下载完成')
    return all_files


def insert_excel_data_to_mysql(filename, host, user, password, database, table, stat_date):
    try:
        # 读取Excel文件 dtype={'证券代码': str} 设置以字符串格式读取
        df = pd.read_excel(filename, dtype={'证券代码': str})
    except FileNotFoundError:
        print(f"文件 {filename} 不存在，已忽略。")
        return
    # 将日期时间类型的列转换为字符串类型
    for col in df.columns:  # 遍历DataFrame中的每一列
        print(f"Column Name: {col}")
        # 把数字中的 "," 替换掉（删除）
        if col != '证券代码' and col != '证券简称':
            df[col] = df[col].str.replace(",", "")  #df[col].replace(",", "")  # 打印出当前列的所有数据

        # if df[col].dtype == 'datetime64[ns]':  # 如果该列的数据类型是日期时间类型
        #     df[col] = df[col].astype(str)  # 将该列的数据类型转换为字符串类型

    # 遍历Excel表格中的每一行，并将每一行插入到数据库中
    for row in df.itertuples(index=False):  # 遍历DataFrame中的每一行
        print(row)
        sql = f"INSERT INTO {table} (stat_date,stock_code,stock_name,rzmr,rzye,rqmc,rqyl,rqye,rzrqye) VALUES ('{stat_date}',%s, %s, %s, %s,%s, %s, %s, %s)"  # SQL插入语句
        # sql = "INSERT INTO " + table + "(stat_date,stock_code,stock_name,rzmr,rzye,rqmc,rqyl,rqye,rzrqye) VALUES (" + ss + ",%s, %s, %s, %s,%s, %s, %s, %s)"  # SQL插入语句
        print(sql)
        val = row  # 插入的数据
        print("正在插入数据:", val)  # 输出正在插入的数据
        insert_db(sql, val)

if __name__ == '__main__':
    host = "localhost"  # 数据库主机地址
    user = "root"  # 数据库用户名
    password = "123"  # 数据库密码
    database = "z_sproot_series"  # 数据库名称
    table = "stock_rzrq"  # 数据库表名

    # 根据指定的日期下载数据
    # 开始日期
    start_date = datetime(2024, 7, 25).date()
    # 结束日期
    end_date = datetime.now().date()
    # 存储路径
    file_save_path = r'D:\workspace\python_all\zz_download_file\rzrq'
    # 下载文件，
    all_files = download_rzrq(start_date, end_date, file_save_path)
    # 开始插入数据
    for file in all_files:
        insert_excel_data_to_mysql(file, host, user, password, database, table, datetime.now().date())
